<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <p>原型式继承主要用来解决用父类的实例替换子类的原型时共有属性的问题，以及父类构造函数执行两次的问题，也就是说通过原型式继承能保证子类的原型是 “干净的”，而保证只在继承父类的属性时执行一次父类。</p>
    <p>原型式继承本质其实是借助了一个中间的构造函数</p>
    <p>缺点：父类的引用属性会被所有子类实例共享。</p>
    <script>
        function Parent(name) {
            this.name = name;
            this.parentName = "parentName";
            this.age = 35;
            console.log("父类构造方法")
        }

        Parent.prototype.sayParentName = function () {
            console.log("sayParentName:", this.parentName);
        }

        Parent.prototype.sayName = function () {
            console.log("sayName:", this.name);
        }

        function Child(name) {
            // 继承构造函数内部的属性
            Parent.apply(this, arguments);
            this.childName = "childName";
        }

        // 继承函数
        function create(obj) {
            function F() { }
            F.prototype = obj;
            return new F();
        }

        // 继承
        Child.prototype = create(Parent.prototype);
        Child.prototype.sayChildName = function () {
            console.log("sayChildName：", this.childName);
        }

        let parent = new Parent("parentName");
        console.log(parent.parentName); // parentName
        parent.sayParentName(); // 正常调用
        parent.sayName(); // 正常调用
        // parent.sayChildName(); // 无法调用（正确）

        console.log("---------------child---------------")
        let child = new Child("奉先");
        console.log(child.age); // 35
        child.sayName(); // 正常调用 奉先
        child.sayParentName(); // 正常调用（并且获取parentName）
        child.sayChildName(); // 正常调用
        console.log(child instanceof Parent); // true

    </script>
</body>

</html>